package me.mingshan.leetcode;

import java.util.*;

/**
 * https://leetcode.cn/problems/cells-in-a-range-on-an-excel-sheet/description/
 * <p>
 * Excel 表中的一个单元格 (r, c) 会以字符串 "<col><row>" 的形式进行表示，其中：
 *
 * <col> 即单元格的列号 c 。用英文字母表中的 字母 标识。
 * 例如，第 1 列用 'A' 表示，第 2 列用 'B' 表示，第 3 列用 'C' 表示，以此类推。
 * <row> 即单元格的行号 r 。第 r 行就用 整数 r 标识。
 * 给你一个格式为 "<col1><row1>:<col2><row2>" 的字符串 s ，其中 <col1> 表示 c1 列，<row1> 表示 r1 行，<col2> 表示 c2 列，<row2> 表示 r2 行，并满足 r1
 * <= r2 且 c1 <= c2 。
 * <p>
 * 找出所有满足 r1 <= x <= r2 且 c1 <= y <= c2 的单元格，并以列表形式返回。单元格应该按前面描述的格式用 字符串 表示，并以 非递减 顺序排列（先按列排，再按行排）。
 *
 * @author hanjuntao
 * @date 2025/5/29 0029
 */
public class L_2194_Cells_In_A_Range_On_An_Excel_Sheet {

    public static void main(String[] args) {
        String s = "K1:L2";
        System.out.println(cellsInRange(s));
    }

    public static List<String> cellsInRange(String s) {
        // K1:L2
        Map<String, Integer> map = initMap();
        Map<Integer, String> map2 = initMap2();

        String[] split = s.split(":");
        if (split.length != 2) {
            return null;
        }

        String start = split[0];
        String end = split[1];

        String startCol = start.substring(0, 1);
        Integer startColIndex = map.get(startCol);
        Integer startRow = Integer.parseInt(start.substring(1, 2));

        String endCol = end.substring(0, 1);
        Integer endColIndex = map.get(endCol);
        Integer endRow = Integer.parseInt(end.substring(1, 2));

        List<String> result = new ArrayList<>();

        // 从startColIndex 开始，到 endColIndex 结束
        for (int i = startColIndex; i <= endColIndex; i++) {
            // 从startRow 开始，到 endRow 结束
            for (int j = startRow; j <= endRow; j++) {
                // 组合：col:row
                String col = map2.get(i);
                String row = String.valueOf(j);
                String cell = col + row;

                result.add(cell);
            }
        }

        return result;
    }

    private static Map<Integer, String> initMap2() {
        Map<Integer, String> map = new HashMap<>();
        map.put(1, "A");
        map.put(2, "B");
        map.put(3, "C");
        map.put(4, "D");
        map.put(5, "E");
        map.put(6, "F");
        map.put(7, "G");
        map.put(8, "H");
        map.put(9, "I");
        map.put(10, "J");
        map.put(11, "K");
        map.put(12, "L");
        map.put(13, "M");
        map.put(14, "N");
        map.put(15, "O");
        map.put(16, "P");
        map.put(17, "Q");
        map.put(18, "R");
        map.put(19, "S");
        map.put(20, "T");
        map.put(21, "U");
        map.put(22, "V");
        map.put(23, "W");
        map.put(24, "X");
        map.put(25, "Y");
        map.put(26, "Z");
        return map;
    }

    private static Map<String, Integer> initMap() {
        Map<String, Integer> colMap = new HashMap<>();
        colMap.put("A", 1);
        colMap.put("B", 2);
        colMap.put("C", 3);
        colMap.put("D", 4);
        colMap.put("E", 5);
        colMap.put("F", 6);
        colMap.put("G", 7);
        colMap.put("H", 8);
        colMap.put("I", 9);
        colMap.put("J", 10);
        colMap.put("K", 11);
        colMap.put("L", 12);
        colMap.put("M", 13);
        colMap.put("N", 14);
        colMap.put("O", 15);
        colMap.put("P", 16);
        colMap.put("Q", 17);
        colMap.put("R", 18);
        colMap.put("S", 19);
        colMap.put("T", 20);
        colMap.put("U", 21);
        colMap.put("V", 22);
        colMap.put("W", 23);
        colMap.put("X", 24);
        colMap.put("Y", 25);
        colMap.put("Z", 26);

        return colMap;
    }
}
